前面介紹很多 go 語言程式設計的相關內容,但是如果把所有程式碼塞在一個 .go 的檔案之中這一篇文章要跟大家介紹如何將 go 語言的代碼分散到各個程式碼中。
本文同步放置於此
在認識那麼多 go 的語法後,如何讓專案快速開發是所有的程式設計師所嚮往的技能,所以這邊跟大家介紹 package 這個語法,相信在第一個 Hello World 就有看到這個關鍵字,接下來要跟大家介紹這關鍵字,以及如何使用這關鍵字來管理專案的程式碼。
說到套件 package 這關鍵字,這裡再來複習一下Go Tour的第一個Hello Wolrd的程式碼,請大家看一下下列程式碼
package main
import "fmt"
func main() {
fmt.Println("Hello, 世界")
}
這最上面就是宣告說目前的套件是 main 這個套件,其實這 package 就類似 c 、 c++ 、 c# 的 namespace ,在命名空間可以看到這是用來宣告目前程式的可視範圍,也就是讓程式知道這段程式在哪個地方可以被執行。接下來 import 就是把其他 package 導進來使用,例如這邊導入了 fmt 這個套件,並引用 fmt 的 Println方法。
前面一個段落告訴大家 package 的功用,這邊在跟大家說明 main 這個套件是必要的,因為這是所有 go 程式的程式進入點,在 main 這個 package 的 main 方法是程式進入點,所有程式都由這方法開始執行。介紹完主要的 package 之後,接下來跟大家說明如何將程式分別寫在其他的 .go 檔。
上面介紹程式的進入點,如果說所有的程式都寫在程式進入點,這樣子管理起來應該會很困擾,所以我們把程式寫在其他的 .go 檔,然後在 main 裡面呼叫我們所寫的程式。這裡要先跟大家說明一下 package 的命名規則是小寫英文字,所以這邊我們寫一個 pkg 的 package 如下面例子
package pkg
var Hello = "Hello"
func SayHello() string {
return "Hello2"
}
上面我們撰寫一個pkg的套件,其中我們宣告一個全域變數 Hello 以及一個方法 SayHello,接下來我們存檔在 hello.go 這檔案,我們的目錄結構如下
main/
├── pkg/
│ ├──hello.go
├── hello.go
最後我們main.go的內容如下
package main
import (
"fmt"
"main/pkg"
)
func main(){
fmt.Println("Hello, world")
fmt.Println(pkg.Hello)
fmt.Println(pkg.SayHello())
}
上面例子說明在程式進入點中,如何透過 import 把我們撰寫在 pkg\hello.go 的程式碼給引用進來並且使用,這裡注意 Hello 的全域變數,讀者們可以試著把他改成 hello,並編譯看看,應該會發現編譯不過,因為命名的不同所代表的存取權限就不同,其中 Hello 字首大寫 為 public,相對的字首小寫 hello 則為 private,所以在撰寫 go 的語法要注意命名。
在說明完如何將 go 的程式做一個切分後,接下來要說明一個好的專案結構的開始是一個專案成功的一半,所以專案結構就是說明專案內的程式要怎麼擺放,這邊可以看看 project-layout 建議的專案目錄結構,相信有一個大家認同的專案結構開發起來會事半功倍。
當然有時候程序會做一些初始化設定,當然這程序必須是在載入該套件時就要被執行的程式碼,接下來的例子是告訴大家如何做到,請大家先看一下下列例子
package pkg
var Hello = "Hello"
func init() {
fmt.Println("This is pkg init")
}
func SayHello() string {
return "Hello2"
}
如此在上面的套件被引用時他的init就會被執行,除此之外main也可以有初始化函式,他的寫法跟套件一樣,大家可以看一下下列例子
package main
import (
"fmt"
"main/pkg"
)
func init() {
fmt.Println("This is main init")
}
func main(){
fmt.Println("Hello, world")
fmt.Println(pkg.Hello)
fmt.Println(pkg.SayHello())
}
每個套件的init被執行的順序是依照import的順序,等到最後被import套件的init被執行後才會執行mian的init。
這篇文章介紹如何將 go 的程式碼做切分,並且說明存取權限是如何設置的,最後跟大家介紹一個許多人認可專案結構,希望對大家的 go 專案開法有所幫助。